﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"

namespace gcmp
{
    class ICurve3d;

    /// \brief 三维曲线图形节点
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsCurve3d : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(IGraphicsCurve3d, IGraphicsNode)
    
    public:
        /// \brief 析构器
        virtual ~IGraphicsCurve3d();

    public:

        /// \brief 获取三维几何曲线
        /// \return 三维曲线
        virtual const ICurve3d* GetGeometry()const = 0;

        /// \brief 设置三维几何曲线
        /// \param pValue 三维几何曲线
        /// \return true-设置成功；false-设置失败
        virtual bool SetGeometry(const ICurve3d* pValue) = 0;

        /// \brief 获取曲线的起点位置处的切向方向
        /// \return 曲线的起点位置处的切向方向的三维向量
        virtual Vector3d GetStartTangent() const = 0;

        /// \brief 获取曲线的终点位置处的切向方向
        /// \return 曲线的终点位置处的切向方向的三维向量
        virtual Vector3d GetEndTangent() const = 0;

        /// \brief 获取曲线的长度
        /// \return 曲线的长度值
        virtual double GetLength() const = 0;

        /// \brief 获取曲线起点的三维坐标
        /// \return 曲线起点的三维坐标
        virtual Vector3d GetStartPoint() const = 0;

        /// \brief 获取曲线终点的三维坐标
        /// \return 曲线终点的三维坐标
        virtual Vector3d GetEndPoint() const = 0;

        /// \brief 获取曲线起点的参数
        /// \return 曲线起点的参数
        virtual double GetStartLimit() const = 0;

        /// \brief 设置曲线起点的参数
        /// \param t 起点参数
        /// \return true-设置成功；false-设置失败
        virtual bool SetStartLimit(double t) = 0;

        /// \brief 获取曲线终点的参数
        /// \return 曲线终点的参数
        virtual double GetEndLimit() const = 0;

        /// \brief 设置曲线终点的参数
        /// \param t 终点参数
        /// \return true-设置成功；false-设置失败
        virtual bool SetEndLimit(double t) = 0;

        /// \brief 获取曲线中的三维坐标
        /// \return 曲线中的三维坐标
        virtual Vector3d GetMiddlePoint() const = 0;

        /// \brief 根据某点参数获取曲线上的位置
        /// \param t 在曲线上某点参数
        /// \return 某点的三维坐标
        virtual Vector3d GetPoint(double parameter) const = 0;

        /// \brief 根据某点参数，获取曲线在某点处的切线方向
        /// \param t 在曲线上某点参数
        /// \return 曲线在某点处的切线方向
        virtual Vector3d GetFirstDerivative(double parameter) const = 0;

        /// \brief 根据坐标点计算对应的参数值
        /// \param pointQuery 坐标点
        /// \param pointParameter 距离容差
        /// \param bIsParameterInRange 点在曲线上的参数
        /// \param dDistEpsilon 求得的参数是否在曲线的参数区间内（true表示在，false表示不在）
        /// \return 点在曲线上（求得的参数对应的点和已知点得距离小于距离容差）返回True，否则返回false
        virtual bool GetParameter(const Vector3d& pointQuery, double& pointParameter, bool& bIsParameterInRange, double dDistEpsilon) const = 0;

    public:
        /// \brief 获取调试信息
        /// \return 调试信息
        virtual std::wstring GetStringForDebug() const = 0;

        /// \brief 判断曲线是否封闭
        /// \return true-封闭；false-不封闭
        virtual bool IsClosed() const = 0;

        /// \brief 对曲线反向
        /// \return 无
        virtual void Reverse() = 0;

        /// \brief 对曲线平移
        /// \param point 平移向量
        /// \return 无
        virtual void Translate(const Vector3d& point) = 0;

        /// \brief 获得几何三维曲线
        /// \return 几何三维曲线
        virtual ICurve3d* GetGmICurveFW() = 0;

        /// \brief 判断曲线是否为投影对象
        /// \return true-是；false-不是
        virtual bool isProjectObject() const = 0;

        /// \brief 设置曲线是否为投影对象
        /// \param inputValue true-是；false-不是
        /// \return 无
        virtual void SetIsProjectObject(bool inputValue) = 0;

    public:
        /// \brief 通过一个三维几何曲线，来创建一个三维曲线图形节点
        /// \param pCurve3d 三维几何曲线
        /// \return 三维曲线图形节点
        static OwnerPtr<IGraphicsCurve3d> Create(const ICurve3d* pCurve3d);
    };
}


